/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package componentes;

import DTO.Usuario;
import com.google.gson.Gson;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.faces.validator.ValidatorException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import tipos.UsuarioStatus;
import tipos.UsuarioTipo;
import utilidades.Hash;

/**
 *
 * @author acazares
 * http://www.primefaces.org/
 * http://www.roseindia.net/jsf/validator.shtml
 * http://jqueryui.com/themeroller/#themeGallery
 */
@ManagedBean
@RequestScoped
public class UsuariosBean {
    private static final long serialVersionUID = 1L;
    private DAO.UsuarioDAO usuarioDao;
    
    //@Size(min=3, max=32) 
    //@NotNull
    private String username;
    private String msgUsername;
    
    //@Size(min=4, max=32) 
    //@NotNull
    private String pass1;
    private String msgPass1;
        
    //@NotNull
    private String pass2;
    private String msgPass2;
    
    //@Size(min=3, max=32) 
    //@NotNull
    private String nombre;
    private String msgNombre;
    
    private tipos.UsuarioTipo tipo;    
    
    private SelectItem[] usuariosTipo = new SelectItem[]{
        new SelectItem(
            tipos.UsuarioTipo.usuario, tipos.UsuarioTipo.usuario.toString() 
        ),
        new SelectItem(
            tipos.UsuarioTipo.equipo, tipos.UsuarioTipo.equipo.toString() 
        )/*,
        new SelectItem(
            tipos.UsuarioTipo.administrador, tipos.UsuarioTipo.administrador.toString() 
        )*/
    };
    
    public UsuariosBean() {
        usuarioDao = new DAO.UsuarioDAO();
    }
    
    public SelectItem[] getUsuariosStatus() {
        return usuariosTipo;
    }
    
    
    public String guardarUsuario(){         
        System.out.println("Iniciando validacion de elementos");
        boolean validacion = nombreValido() & usuarioValido() & passValido();
        System.out.println("Resultado: "+validacion);
        if(!validacion){
            return "nuevoUsuario";
        }
        Usuario usr = new Usuario();
        usr.setNombre(nombre);
        usr.setUser(username);
        usr.setPass( utilidades.Hash.md5(pass1) );        
        usr.setStatus(UsuarioStatus.nuevo);
        usr.setTipo(tipo);
        usr.setCreacion(new Date());
        usr.setUltimoAcceso(new Date());
        
        try{
            usuarioDao.guardar(usr);
            System.out.println("usuario id: "+usr.getId() );
            login(usr);
        }catch(Exception e){
            System.out.println( "Se presento un problema: "+e );
        }finally{
            return "index";
        }
    }
    
    
    
    
    public void login(Usuario usr){         
        FacesContext context = FacesContext.getCurrentInstance();  
        HttpServletRequest request = (HttpServletRequest)context.
                getExternalContext().getRequest();  
        HttpSession httpSession = request.getSession(false);  
        
        System.out.println("usuario: "+usr.getNombre());
        if(usr.isValid()){
            httpSession.setAttribute("usuario", usr);
            System.out.println("Se ha establecido login");
        }else{
            System.out.println("No se completo login, usuario no valido");
        }
    }
    
    public void logout(){
        FacesContext context = FacesContext.getCurrentInstance();  
        HttpServletRequest request = (HttpServletRequest)context.
                getExternalContext().getRequest();  
        HttpSession httpSession = request.getSession(false);
        httpSession.invalidate();
        System.out.println("logout");        
    }
    /*
    public String actionLogout(){
        logout();
        Gson gson = new Gson();
        return gson.toJson( new Usuario() );        
    }
    public String actionLogin(String user, String pass){
        Gson gson = new Gson();        
        Usuario usuario = usuarioDao.getUsuarioByUserPass(user, Hash.md5(pass));
        System.out.println("Preparando login: "+user+","+pass);        
        login(usuario);
        System.out.println("Finalizando login: "+gson.toJson( usuario ));
        return gson.toJson( usuario );        
    }
    */
    
    public boolean nombreValido(){
        if(nombre == null || nombre.length() == 0){
            msgNombre = "Campo requerido";
            return false;
        }
        if(nombre.length() <3){
            msgNombre = "Al menos debe contener 3 caracteres";
            return false;
        }
        if(nombre.length() >32){
            msgNombre = "Máximo 32 caracteres";
            return false;
        }
        return true;
    }
    public boolean usuarioValido(){
        if(username == null || username.length() == 0){
            msgUsername = "Campo requerido";
            return false;
        }
        String regex = "^\\w+([\\.-]?\\w+)*@\\w+([\\.-]?\\w+)*(\\.\\w{2,3})+$";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(username);
        if( !matcher.matches() ){
            msgUsername = "formato de correo electrónico no válido";
            return false;
        }
        if( usuarioDao.countByUsername(username) >0 ){
            msgUsername ="Alguien mas ya ha usado ["+username
                    +"] como nombre de usuario";
            return false;
        }
        return true;
    }
    public boolean passValido(){
        if(pass2 == null || pass2.length() == 0){
            msgPass2 = "Campo requerido";
        }
        if(pass1 == null || pass1.length() == 0){
            msgPass1 = "Campo requerido";
            return false;
        }
        String regex = "";        
        regex += "^(?=.*[A-Z]).{6,}$|^(?=.*[.]).{6,}$";//M6,e6,
        regex += "|^(?=.*[0-9]).{7,}$|^(?=.*[a-z]).{12,}$";//n7,m12
        
        regex += "|^(?=.*[0-9])(?=.*[A-Z]).{4,}$";//nM4
        regex += "|^(?=.*[.])(?=.*[A-Z]).{4,}$";//eM4
        regex += "|^(?=.*[.])(?=.*[0-9]).{4,}$";//en4
        regex += "|^(?=.*[.])(?=.*[a-z]).{5,}$";//en5
        regex += "|^(?=.*[A-Z])(?=.*[a-z]).{6,}$";//Mm6
        regex += "|^(?=.*[0-9])(?=.*[a-z]).{7,}$";//nm7
                
        regex += "|^(?=.*[.])(?=.*[a-z])(?=.*[A-Z]).{4,}$";//emM4//
        regex += "|^(?=.*[.])(?=.*[a-z])(?=.*[0-9]).{4,}$";//emn4//
        regex += "|^(?=.*[.])(?=.*[A-Z])(?=.*[0-9]).{3,}$";//enM3//
        regex += "|^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).{4,}$";//mMn//
        
        regex += "|^(?=.*[.])(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).{4,}$";//emMn4//
       
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(pass1);
        if( !matcher.matches() ){
        //if( !matcher.matches() ){
            msgPass1 = "El password no es seguro";
            msgPass2 = "Utilice numeros, letras minusculas, letras mayusculas y opcionalmente caracteres especiales.";
            return false;
        }
        if(!pass1.equals(pass2)){
            msgPass1 = "Falló la confirmación del password";
            return false;
        }        
        return true;
    }
    ///////////////////////////////////////////////////////////////////////
    public String getMsgUsername() {
        return msgUsername;
    }

    public String getMsgPass1() {
        return msgPass1;
    }

    public String getMsgPass2() {
        return msgPass2;
    }

    public String getMsgNombre() {
        return msgNombre;
    }
    
    ///////////////////////////////////////////////////////////////////////
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPass1() {
        return pass1;
    }

    public void setPass1(String pass) {
        this.pass1 = pass;
    }
    
    public String getPass2() {
        return pass1;
    }

    public void setPass2(String pass) {
        this.pass2 = pass;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    
    public UsuarioTipo getTipo() {
        return tipo;
    }

    public void setTipo(UsuarioTipo tipo) {
        this.tipo = tipo;
    }
    
    public SelectItem[] getTipos(){
        return usuariosTipo;
    }
    
    
    
    
}
